package sv.com.renacempleo.dao.ctg;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Vector;

import org.apache.commons.lang.StringUtils;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Projections;
import org.hibernate.criterion.Restrictions;

import sv.com.renacempleo.dao.BaseDaoImpl;
import sv.com.renacempleo.dto.ctg.CtgMunicipio;
import sv.com.renacempleo.exception.WebException;
import sv.com.renacempleo.web.util.WebUtilidades;

public class CtgMunicipioDaoImpl extends BaseDaoImpl implements CtgMunicipioDao{

	@SuppressWarnings("unchecked")
	public List<Object[]> findAllActivesAsArray() throws WebException {
		DetachedCriteria criteria = DetachedCriteria.forClass(CtgMunicipio.class);
		criteria.addOrder(Order.asc("ctgDepartamento.ctgDepartamentoId"));
		criteria.addOrder(Order.asc("ctgMunicipioNombre"));
		criteria.add(Restrictions.eq("ctgMunicipioActivo", "1"));
		criteria.setProjection(Projections.projectionList().
				add(Projections.property("ctgMunicipioId")).
				add(Projections.property("ctgMunicipioNombre")).
				add(Projections.property("ctgDepartamento.ctgDepartamentoId"))
			);
		return (List<Object[]>) findByCriteria(criteria);
	}
	
	@SuppressWarnings("unchecked")
	public List<Object[]> findAllAsArray() throws WebException {
		DetachedCriteria criteria = DetachedCriteria.forClass(CtgMunicipio.class);
		criteria.addOrder(Order.asc("ctgDepartamento.ctgDepartamentoId"));
		criteria.createAlias("ctgDepartamento", "ctgDepartamento");
		criteria.setProjection(Projections.projectionList().
				add(Projections.property("ctgMunicipioId")).
				add(Projections.property("ctgMunicipioNombre")).
				add(Projections.property("ctgMunicipioActivo")).
				add(Projections.property("ctgDepartamento.ctgDepartamentoId")).
				add(Projections.property("ctgDepartamento.ctgDepartamentoNombre"))
		);
		return (List<Object[]>) findByCriteria(criteria);
	}

	public void delete(Long ctgMunicipioId) throws WebException{
		try {
			String hqlQuery = "delete from CtgMunicipio where ctgMunicipioId = :ctgMunicipioId";
			Map<String, Object> parameters = new HashMap<String, Object>();
			parameters.put("ctgMunicipioId", ctgMunicipioId);
			executeNonHibernateQuery(hqlQuery, parameters);
		} catch (Exception e) {
			throw new WebException("Problemas al tratar de eliminar el registro <br />Registro puede estar asociado a un Cliente, Poliza, etc");
		}
	}
	
	public void toggleActive(Long ctgMunicipioId, String ctgMunicipioActivo) throws WebException{
		try {
			String hqlQuery = "update CtgMunicipio set ctgMunicipioActivo = :ctgMunicipioActivo where ctgMunicipioId = :ctgMunicipioId";
			Map<String, Object> parameters = new HashMap<String, Object>();
			parameters.put("ctgMunicipioId", ctgMunicipioId);
			parameters.put("ctgMunicipioActivo", "1".equals(ctgMunicipioActivo) ? "0" : "1");
			executeNonHibernateQuery(hqlQuery, parameters);
		} catch (WebException e) {
			throw e;
		} catch (Exception e) {
			throw new WebException("Problemas al actualizar la informaci\u00F3n");
		}
	}

	@SuppressWarnings("unchecked")
	public List<Object[]> findMunByDepId(Long ctgDepartamentoId)
			throws WebException {
		DetachedCriteria criteria  = DetachedCriteria.forClass(CtgMunicipio.class);
		criteria.addOrder(Order.asc("ctgDepartamento.ctgDepartamentoId"));
		criteria.createAlias("ctgDepartamento", "ctgDepartamento");
		criteria.add(Restrictions.eq("ctgDepartamento.ctgDepartamentoId", ctgDepartamentoId));
		criteria.setProjection(Projections.projectionList().
				add(Projections.property("ctgMunicipioId")).
				add(Projections.property("ctgMunicipioNombre")).
				add(Projections.property("ctgMunicipioActivo")).
				add(Projections.property("ctgDepartamento.ctgDepartamentoId")).
				add(Projections.property("ctgDepartamento.ctgDepartamentoNombre"))
		);
		return (List<Object[]>) findByCriteria(criteria);
	}

	@SuppressWarnings("unchecked")
	public List<Object[]> findAllActivesConcatNameDepAndMun()
			throws WebException {
		String hqlQuery = WebUtilidades.getQueryByName("redDemandante.findAllDepartamentosMunicipios");
		Vector<Object> parameters = new Vector<Object>();
		String where = "";
		parameters.add("1");
		parameters.add("1");
		where = " ctgMunicipio.ctgMunicipioActivo = ? and ctgDepartamento.ctgDepartamentoActivo = ?";
		hqlQuery = StringUtils.replace(hqlQuery, "{WHERE}", StringUtils.isNotBlank(where) ? (" where " + where) : "");
		try {
			return (List<Object[]>) findByHQLQuery(hqlQuery,parameters.toArray());
		} catch (Exception e) {
			throw new WebException("Problemas al ejecutar la busqueda de departamentos y municipios");
		}
	}	
}
